package com.autumn.zero.authorization.services;

import java.util.List;
import java.util.Map;

import com.autumn.domain.services.IDomainService;
import com.autumn.zero.authorization.entitys.IPermissionEntity;
import com.autumn.zero.authorization.values.ResourcesModulePermissionTreeValue;
import com.autumn.zero.authorization.values.ResourcesModuleTreeValue;

/**
 * 资源服务抽象
 * 
 * @author 杨昌国 2018-12-05 18:48:28
 */
public interface IResourcesService extends IDomainService {

	/**
	 * 基于 shiro 权限过滤 Map
	 * 
	 * @return
	 */
	Map<String, String> shiroPermissionFilterMap();

	/**
	 * 查询模块菜单树集合
	 * 
	 * @param resourcesType 资源类型
	 * @return
	 */
	List<ResourcesModuleTreeValue> queryByMenuTree(int resourcesType);

	/**
	 * 过滤模块树，可用于加载用户前端菜单
	 * 
	 * @param moduleTree  模块树
	 * @param permissions 权限集合
	 * @return
	 */
	<P extends IPermissionEntity> List<ResourcesModuleTreeValue> filterModuleTree(
			List<ResourcesModuleTreeValue> moduleTree, List<P> permissions);

	/**
	 * 查询资源模块树集合
	 * 
	 * @return
	 */
	List<ResourcesModuleTreeValue> queryByTree();

	/**
	 * 查询资源模块树集合
	 * 
	 * @param resourcesType 资源类型
	 * @return
	 */
	List<ResourcesModuleTreeValue> queryByTree(int resourcesType);

	/**
	 * 查询模块权限树
	 * 
	 * @return 均返回待授权状态
	 */
	List<ResourcesModulePermissionTreeValue> queryByPermissionTree();

	/**
	 * 查询模块权限树
	 * 
	 * @param resourcesType 资源类型
	 * @return 均返回待授权状态
	 */
	List<ResourcesModulePermissionTreeValue> queryByPermissionTree(int resourcesType);
	
	/**
	 * 清除模块缓存
	 */
	void clearModuleCache();
	
	/**
	 * 清除模块权限缓存
	 */
	void clearModulePermissionCache();

	/**
	 * 匹配模块权限树
	 * 
	 * @param permissions 权限集合
	 * @return 如果权限与模块权限匹配则返回已授权，否则为未授权
	 */
	<P extends IPermissionEntity> List<ResourcesModulePermissionTreeValue> matchByPermissionTree(List<P> permissions);

	/**
	 * 匹配模块权限树
	 * 
	 * @param resourcesType 资源类型
	 * @param permissions   权限集合
	 * @return 如果权限与模块权限匹配则返回已授权，否则为未授权
	 */
	<P extends IPermissionEntity> List<ResourcesModulePermissionTreeValue> matchByPermissionTree(int resourcesType,
			List<P> permissions);

	/**
	 * 不改变原的的对象加载新的模块权限
	 * 
	 * @param sources     源集合
	 * @param permissions 权限集合
	 * @return 返回新的匹配模块权限
	 */
	<P extends IPermissionEntity> List<ResourcesModulePermissionTreeValue> loadByPermissionTree(
			List<ResourcesModulePermissionTreeValue> sources, List<P> permissions);
}
